From: Georges Basile Stavracas Neto Date: Thu, 23 Jun 2022 19:41:42 +0000 (-0300) Subject: appDisplay: Readd next and previous page icons previews X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~461^2^2~66 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=f22a5c5a911ef08b958670a84138315e5b7f0da2;p=gnome-shell.git appDisplay: Readd next and previous page icons previews This was lost 2 commits ago, but now we reimplement this in a different way. There is some jesting with allocations, since we cannot use transformed positions while changing translation of the icons. This new implementation works regardless of the screen resolution. Part-of: --- diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js index c29991900..77fac9e1e 100644 --- a/js/ui/appDisplay.js +++ b/js/ui/appDisplay.js @@ -229,6 +229,7 @@ class BaseAppViewGridLayout extends Clutter.BinLayout { this._showIndicators = false; this._currentPage = 0; + this._pageWidth = 0; } _getIndicatorsWidth(box) { @@ -315,6 +316,65 @@ class BaseAppViewGridLayout extends Clutter.BinLayout { }); } + _getEndIcon(icons) { + const {columnsPerPage} = this._grid.layoutManager; + const index = Math.min(icons.length, columnsPerPage); + return icons[Math.max(index - 1, 0)]; + } + + _translatePreviousPageIcons(value, ltr) { + if (this._currentPage === 0) + return; + + const previousPage = this._currentPage - 1; + const icons = this._grid.getItemsAtPage(previousPage).filter(i => i.visible); + if (icons.length === 0) + return; + + const {left, right} = this._grid.indicatorsPadding; + const {columnSpacing} = this._grid.layoutManager; + const endIcon = this._getEndIcon(icons); + let iconOffset; + + if (ltr) { + const currentPageOffset = this._pageWidth * this._currentPage; + iconOffset = currentPageOffset - endIcon.allocation.x2 + left - columnSpacing; + } else { + const rtlPage = this._grid.nPages - previousPage - 1; + const pageOffset = this._pageWidth * rtlPage; + iconOffset = pageOffset - endIcon.allocation.x1 - right + columnSpacing; + } + + for (const icon of icons) + icon.translationX = iconOffset * value; + } + + _translateNextPageIcons(value, ltr) { + if (this._currentPage >= this._grid.nPages - 1) + return; + + const nextPage = this._currentPage + 1; + const icons = this._grid.getItemsAtPage(nextPage).filter(i => i.visible); + if (icons.length === 0) + return; + + const {left, right} = this._grid.indicatorsPadding; + const {columnSpacing} = this._grid.layoutManager; + let iconOffset; + + if (ltr) { + const pageOffset = this._pageWidth * nextPage; + iconOffset = pageOffset - icons[0].allocation.x1 - right + columnSpacing; + } else { + const rtlPage = this._grid.nPages - this._currentPage - 1; + const currentPageOffset = this._pageWidth * rtlPage; + iconOffset = currentPageOffset - icons[0].allocation.x2 + left - columnSpacing; + } + + for (const icon of icons) + icon.translationX = iconOffset * value; + } + _syncPageIndicators() { if (!this._container) return; @@ -338,6 +398,16 @@ class BaseAppViewGridLayout extends Clutter.BinLayout { ltr ? leftArrowOffset : rightArrowOffset; this._nextPageArrow.translationX = ltr ? rightArrowOffset : leftArrowOffset; + + // Page icons + this._translatePreviousPageIcons(value, ltr); + this._translateNextPageIcons(value, ltr); + + if (this._grid.nPages > 0) { + this._grid.getItemsAtPage(this._currentPage).forEach(icon => { + icon.translationX = 0; + }); + } } vfunc_set_container(container) { @@ -367,6 +437,8 @@ class BaseAppViewGridLayout extends Clutter.BinLayout { this._previousPageArrow.allocate(ltr ? leftBox : rightBox); this._nextPageIndicator.allocate(ltr ? rightBox : leftBox); this._nextPageArrow.allocate(ltr ? rightBox : leftBox); + + this._pageWidth = box.get_width(); } goToPage(page, animate = true) {